#ifndef SOUNDSERVICE_H
#define SOUNDSERVICE_H

#include <QObject>
#include <QMediaPlayer>
#include <QTimer>
#include <QMutex>
#include <QMap>
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
#include <QAudioOutput>
#endif
#include "service_global.h"
#include "config/GlobalDefine.h"

/**
 * @brief 音频服务类 - 统一管理应用中的所有音频播放
 * 
 * 职责：
 * - 播放各种类型的音频（报警、提示音等）
 * - 管理音频播放器
 * - 控制静音状态
 * - 管理音量
 */
class SERVICE_EXPORT SoundService : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 获取单例实例
     */
    static SoundService& instance();

    /**
     * @brief 播放指定类型的报警音
     * @param type 报警类型
     * @param soundSettings 音频设置
     */
    void playAlarm(TipType type, const SoundSettings& soundSettings);

    /**
     * @brief 播放指定路径的音频文件
     * @param filePath 音频文件路径
     * @param volume 音量（0-100）
     */
    void playSound(const QString& filePath, int volume = 100);

    /**
     * @brief 停止当前播放的音频
     */
    void stopSound();

    /**
     * @brief 停止所有音频播放
     */
    void stopAll();

    /**
     * @brief 开始播放嘀嗒声（循环播放）
     * @param volume 音量（0-100），默认为30（较低音量）
     */
    void startTickSound(int volume = 30);

    /**
     * @brief 停止播放嘀嗒声
     */
    void stopTickSound();

    /**
     * @brief 获取嘀嗒声是否正在播放
     */
    bool isTickSoundPlaying() const;

    /**
     * @brief 设置嘀嗒声间隔（毫秒）
     */
    void setTickInterval(int intervalMs);

    /**
     * @brief 设置静音状态
     * @param muted true=静音，false=取消静音
     */
    void setMuted(bool muted);

    /**
     * @brief 获取静音状态
     */
    bool isMuted() const;

    /**
     * @brief 设置全局音量
     * @param volume 音量（0-100）
     */
    void setVolume(int volume);

    /**
     * @brief 获取全局音量
     */
    int getVolume() const;

    /**
     * @brief 预加载默认提示音，降低首次播放延迟
     */
    void preloadDefaults();

    /**
     * @brief 检查音频文件是否存在
     * @param filePath 文件路径
     * @return 是否存在
     */
    bool isFileExists(const QString& filePath) const;

signals:
    /**
     * @brief 音频播放开始信号
     * @param type 音频类型
     */
    void soundStarted(TipType type);

    /**
     * @brief 音频播放完成信号
     * @param type 音频类型
     */
    void soundFinished(TipType type);

    /**
     * @brief 音频播放错误信号
     * @param error 错误信息
     */
    void soundError(const QString& error);

private:
    explicit SoundService(QObject *parent = nullptr);
    ~SoundService();

    // 禁用拷贝
    SoundService(const SoundService&) = delete;
    SoundService& operator=(const SoundService&) = delete;

    /**
     * @brief 获取音频信息
     * @param type 报警类型
     * @param soundSettings 音频设置
     * @return 音频信息（路径、是否启用等）
     */
    SoundInfo getSoundInfo(TipType type, const SoundSettings& soundSettings) const;

    /**
     * @brief 获取默认系统提示音路径
     * @param type 报警类型
     * @return 默认提示音的资源路径
     */
    QString getDefaultSoundPath(TipType type) const;

    /**
     * @brief 内部播放音频的实现
     * @param filePath 文件路径
     * @param volume 音量
     * @param type 音频类型（用于信号）
     */
    void playInternal(const QString& filePath, int volume, TipType type);

    /**
     * @brief 将文件路径转换为可用的 QUrl（支持本地文件与 qrc 资源）
     */
    QUrl toUrl(const QString& filePath) const;

private:
    QMediaPlayer* m_player;         // 主音频播放器
    QMediaPlayer* m_tickPlayer;     // 嘀嗒声播放器（独立播放器，避免干扰报警音）
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
    QAudioOutput* m_audioOutput;    // Qt 6: 音频输出设备
    QAudioOutput* m_tickAudioOutput; // Qt 6: 嘀嗒声音频输出
#endif
    QTimer* m_tickTimer;            // 嘀嗒声定时器（控制播放间隔）
    QMutex m_tickMutex;             // 嘀嗒声播放器的线程安全锁
    bool m_isMuted;                 // 是否静音
    int m_globalVolume;             // 全局音量
    TipType m_currentPlayingType;   // 当前播放的音频类型
    bool m_tickEnabled;             // 嘀嗒声是否启用
    bool m_tickMediaSet;            // 嘀嗒声媒体是否已设置
    int m_tickIntervalMs;           // 嘀嗒声间隔（毫秒）
    
    /**
     * @brief 嘀嗒声播放槽函数（由定时器触发）
     */
    void onTickTimerTimeout();
    
    /**
     * @brief 播放一次嘀嗒声（内部函数，已加锁保护）
     */
    void playTickOnce();
};

#endif // SOUNDSERVICE_H
